home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_05 / colton / xwdsave.c < prev   
C/C++ Source or Header  |  1995-02-21  |  2KB  |  86 lines

  1. /*
  2.  * Listing 8 - xwd.c (saver)
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include <X11/XWDFile.h>
  9. #include "ips_image.h"
  10.  
  11. void write_ximage();
  12.  
  13. int
  14. main(argc, argv)
  15. int argc;
  16. char **argv;
  17. {
  18.     ips_header    header;
  19.     ips_image    image;
  20.  
  21.  
  22.     if (argc<3) {
  23.         printf("Usage: %s infile outfile\n", argv[0]);
  24.         exit(1);
  25.     }
  26.  
  27.     ips_to_img(&header, &image, argv[1]);
  28.  
  29.     write_ximage(&header, &image, argv[2]);
  30.  
  31.     exit(0);
  32. }
  33.  
  34.  
  35. void
  36. write_ximage(header, image, filename)
  37. ips_header    *header;
  38. ips_image    *image;
  39. char        *filename;
  40. {
  41.     int                i;
  42.     FILE            *fp;
  43.     XWDFileHeader    xheader;
  44.     XWDColor        xcmap[256];
  45.  
  46.  
  47.     memset(&xheader, 0, sizeof(XWDFileHeader));
  48.  
  49.     xheader.header_size        = sizeof(XWDFileHeader);
  50.     xheader.file_version    = XWD_FILE_VERSION;
  51.     xheader.pixmap_format    = 2; /* ZPixmap */
  52.     xheader.pixmap_depth    = header->bpp;
  53.     xheader.pixmap_width    = header->width;
  54.     xheader.pixmap_height    = header->height;
  55.     xheader.byte_order        = 1;
  56.     xheader.bitmap_unit        = 32;
  57.     xheader.bitmap_bit_order= 1;
  58.     xheader.bitmap_pad        = 32;
  59.     xheader.bits_per_pixel    = 8;
  60.     xheader.bytes_per_line    = header->width;
  61.     xheader.visual_class    = 3; /* PseudoColor */
  62.     xheader.bits_per_rgb    = header->bpp;
  63.     xheader.colormap_entries= header->cmap_count;
  64.     xheader.ncolors            = header->cmap_count;
  65.     xheader.window_width    = header->width;
  66.     xheader.window_height    = header->height;
  67.  
  68.     for (i=0; i < header->cmap_count; i++) {
  69.         xcmap[i].pixel    = i;
  70.         xcmap[i].red    = image->cmap[i].red   << 8;
  71.         xcmap[i].green    = image->cmap[i].green << 8;
  72.         xcmap[i].blue    = image->cmap[i].blue  << 8;
  73.     }
  74.  
  75.     if ((fp = fopen(filename, "w")) == NULL) {
  76.         perror("write_ximage");
  77.         exit(1);
  78.     }
  79.  
  80.     fwrite(&xheader, 1, sizeof(XWDFileHeader), fp);
  81.     fwrite(xcmap, 1, sizeof(XWDColor) * header->cmap_count, fp);
  82.     fwrite(image->data, 1, header->width * header->height, fp);
  83.  
  84.     fclose(fp);
  85. }
  86.